/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tp1_resoprob;

import java.util.ArrayList;

/**
 *
 * @author amerer & dleang
 * Boo & Foo STYLE!
 */
public class Tp1_resoprob
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        //ArbreNaire arbreTP1 = new ArbreNaire(new Integer(1));
        //arbreTP1=BuildArbreTP1(2,3,arbreTP1);
        //DeapthSearchTP1(arbreTP1);
        
        ArbreNaire arbreTP2 = new ArbreNaire(new MaClasse(1,0));
        arbreTP2=BuildArbreTP2(2,3,arbreTP2);
        DeapthSearchTP2(arbreTP2);
        minMax(arbreTP2);
        
        System.out.println("FINI!");
        
        
    }
    
    public static ArbreNaire BuildArbreTP1(int profondeur, int largeur, ArbreNaire arbre)
    {
       if(profondeur==1)
       {
           for(int i=0;i<largeur;i++)
           {
               
               Integer pivot = new Integer(arbre.vue.getInfo().toString()+i);
               arbre.addFils(pivot);
           }
       }
       else
       {
           for(int i = 0; i < largeur; i ++)
           {
               Integer pivot = new Integer(arbre.vue.getInfo().toString()+i);
               arbre.addFils(pivot);
               arbre.goToFils(i);
               BuildArbreTP1(profondeur-1,largeur, arbre);
               arbre.goToPere();
           }
       }
       return arbre;
   }
    
    public static void DeapthSearchTP1(ArbreNaire arbre)
    {
        //arbre.vue=arbre.racine;
        System.out.println(arbre.vue.getInfo().toString());

        if(!arbre.isNoeudFeuille())
        {
            for(int i=0; i < arbre.getNbFils(); i++)
            {
                arbre.goToFils(i);
                DeapthSearchTP1(arbre);
                arbre.goToPere();
            }
        }
    } 
    
    public static ArbreNaire BuildArbreTP2(int profondeur, int largeur, ArbreNaire arbre)
    {
       
       if(profondeur==1)
       {
           for(int i=0;i<largeur;i++)
           {
               MaClasse mc=new MaClasse();
               mc = (MaClasse)arbre.vue.getInfo();
               int var=mc.getIdent()*10+i;
               MaClasse pivot = new MaClasse(var,1);
               arbre.addFils(pivot);
           }
       }
       else
       {
           for(int i = 0; i < largeur; i ++)
           {
               MaClasse mc=new MaClasse();
               mc = (MaClasse)arbre.vue.getInfo();
               int var=mc.getIdent()*10+i;
               MaClasse pivot = new MaClasse(var,0);
               arbre.addFils(pivot);
               arbre.goToFils(i);
               BuildArbreTP2(profondeur-1,largeur, arbre);
               arbre.goToPere();
           }
       }
       return arbre;
   }
    
    public static void DeapthSearchTP2(ArbreNaire arbre)
    {
        MaClasse mc=new MaClasse();
        mc = (MaClasse)arbre.vue.getInfo();
        int iIdent=mc.getIdent();
        float fHeuristique=mc.getValHeuristique();
        System.out.println("Ident : "+iIdent+" - valHeuristique : "+fHeuristique);

        if(!arbre.isNoeudFeuille())
        {
            for(int i=0; i < arbre.getNbFils(); i++)
            {
                arbre.goToFils(i);
                DeapthSearchTP2(arbre);
                arbre.goToPere();
            }
        }
    } 
    
    public static Noeud<MaClasse> minMax (ArbreNaire arbre)
    {
        int cpt=0;
        while(!arbre.isNoeudFeuille())
        {
            arbre.goToFils(0);
            cpt++;
        }
        while(arbre.vue!=arbre.racine)
        {
            
            for(int i=0;i<=cpt;i++)
            {
                arbre.goToPere();
                for(int j=0;j<arbre.getNbFils();j++)
                {
                    //int temp =((MaClasse)(arbre.vue.getInfo())).getIdent();
                    if(j%2==0)
                    {                      
                        minimise(arbre.vue);
                    }
                    else
                    {
                        maximise(arbre.vue);
                    }   
                } 
                arbre.goToFils(i);
                arbre.goToPere();
                
            }
        }
        return arbre.vue;
    }
    
    public static void minimise (Noeud<MaClasse> node)
    {
        ArrayList<Noeud<MaClasse>> liste = node.getFils();
        int size = liste.size();
        MaClasse temp = new MaClasse();
        MaClasse parse = new MaClasse();
        temp = liste.get(0).getInfo();
        
        for(int i=1;i<size;i++)
        {
            parse=liste.get(i).getInfo();
            if(parse.getValHeuristique()<temp.getValHeuristique())
            {
                temp=parse;
            }
        }
        node.setInfo(temp); 
        System.out.println("MIN : "+temp.getValHeuristique());
    }
    
    public static void maximise (Noeud<MaClasse> node)
    {
        ArrayList<Noeud<MaClasse>> liste = node.getFils();
        int size = liste.size();
        MaClasse temp = new MaClasse();
        MaClasse parse = new MaClasse();
        
        for(int i=0;i<size;i++)
        {
            parse=liste.get(i).getInfo();
            if(parse.getValHeuristique()>temp.getValHeuristique())
            {
                temp=parse;
            }
        }
        node.setInfo(temp); 
        System.out.println("MAX : "+temp.getValHeuristique());
    }
    
    
    
}
    



    
    
   
    
            

